/**
 * 工具函数集合
 * @type {{}}
 */

/**
 * 列表转为树结构
 * @param {Array} list - 要转换的列表
 * @param {Object} options - 配置选项
 * @param {string} [options.idKey='id'] - ID字段名
 * @param {string} [options.parentKey='parentId'] - 父ID字段名
 * @param {string} [options.childrenKey='children'] - 子节点字段名
 * @returns {Array} 树形结构数据
 */
const listToTree = (list, options = {}) => {
    const {
        idKey = 'id',
        parentKey = 'parent_id',
        childrenKey = 'children'
    } = options;

    const map = {};
    const roots = [];

    // 首先将所有项目映射到一个对象中
    for (const item of list) {
        map[item[idKey]] = {
            ...item,
            [childrenKey]: []
        };
    }

    // 构建树结构
    for (const item of list) {
        const node = map[item[idKey]];
        if (item[parentKey] === null || item[parentKey] === 0 || !map[item[parentKey]]) {
            // 如果没有父节点或父节点不存在，作为根节点
            roots.push(node);
        } else {
            // 将当前节点添加到父节点的children数组中
            map[item[parentKey]][childrenKey].push(node);
        }
    }

    // 递归排序函数
    const sortTreeNodes = (nodes) => {
        // 对当前层级节点按sort字段排序
        nodes.sort((a, b) => (a.sort || 0) - (b.sort || 0));
        // 递归对子节点进行排序
        nodes.forEach(node => {
            if (node[childrenKey] && node[childrenKey].length > 0) {
                sortTreeNodes(node[childrenKey]);
            }
        });
        return nodes;
    };

    // 对根节点及其所有子节点进行排序
    return sortTreeNodes(roots);
};

/**
 * 列表转map
 * 指定列表里面的某个字段作为key，map中key的值是list
 * @param {Array} list - 要转换的列表
 */
const listToMap = (list, key) => {
    const map = {};
    // 将列表中的某个字段作为key，map中key的值是list
    list.forEach(item => {
        if (!map[[item[key]]]) {
            map[item[key]] = [];
        }
        map[item[key]].push({
            ...item
        });
    })
    return map
};

/**
 * 格式化数据库查询出来的DECIMAL(10, 2)数据
 * 将字符串金额格式化为数字金额
 * 如果传入的是对象或数组，则递归处理其中的金额字段
 *
 * @param {string|number|Object|Array} value - 要格式化的值或包含金额字段的对象/数组
 * @param {Array} [decimalFields] - 需要格式化的字段名数组，当value是对象或数组时使用
 * @returns {number|Object|Array} 格式化后的值
 */
const formatDecimal = (value, decimalFields = []) => {
    // 如果值为null或undefined，直接返回0
    if (value === null || value === undefined) {
        return 0;
    }

    // 如果是数字，直接返回
    if (typeof value === 'number') {
        return value;
    }

    // 如果是字符串，转换为数字
    if (typeof value === 'string') {
        // 使用Math.round处理精度问题，避免toFixed的舍入问题
        return Math.round(parseFloat(value) * 100) / 100;
    }
    // 其他情况返回0
    return 0;
};

const dayjs = require("dayjs");
const formatDate = (date, fmt = 'YYYY-MM-DD HH:mm:ss') => {
    if (!date || date === 'Invalid date') {
        return null
    }
    return dayjs(date).format(fmt);
}

module.exports = {
    listToTree,
    listToMap,
    formatDecimal,
    formatDate,
    parseTime: formatDate,
    parseNum: formatDecimal
}
